Introduction

Was browsing through some of the datasets that had been featured in TidyTuesday, and the Nobel Laureate data caught my eye. I had little to no prior knowledge on Nobel Laureate winner data, so I was curious to learn basic information such as the number of winners across different fields/regions. Furthermore, it seemed like a fitting data set that would be able to incorporate relevant visualizations that were asked for. I.e., the spatial visualization being able to be used for showing distribution of winners from around the world. For the scope of this work, I decided to focus on the nobel winners data and not the data that included all of the separate publications from nobel winners.

Libraries, Data Importing/Preprocessing

Load Libraries

library(tidyverse) #mostly for ggplot
library(lubridate) #working with dates/times
library(plotly) #interactive plots
library(sf) #world shapefile

Set theme

theme_set(theme_bw())

Read in data, add column to sort by decade for cleaner plots

nobel_winners <- read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2019/2019-05-14/nobel_winners.csv") %>% #read_csv is significantly faster here than read.csv
  distinct(full_name, prize_year, category, .keep_all = TRUE) %>%
  mutate(decade = 10 * (prize_year %/% 10),
         age = prize_year - year(birth_date))
Rows: 969 Columns: 18
-- Column specification ---------------------------------------------------------------------------------------------------------------
Delimiter: ","
chr  (14): category, prize, motivation, prize_share, laureate_type, full_name, birth_city, birth_country, gender, organization_name...
dbl   (2): prize_year, laureate_id
date  (2): birth_date, death_date

i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.

Glimpse at Nobel Winners

glimpse(nobel_winners)
Rows: 911
Columns: 20
$ prize_year           <dbl> 1901, 1901, 1901, 1901, 1901, 1901, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1903, 1903, 1903, 1903, 19~
$ category             <chr> "Chemistry", "Literature", "Medicine", "Peace", "Peace", "Physics", "Chemistry", "Literature", "Medicine~
$ prize                <chr> "The Nobel Prize in Chemistry 1901", "The Nobel Prize in Literature 1901", "The Nobel Prize in Physiolog~
$ motivation           <chr> "\"in recognition of the extraordinary services he has rendered by the discovery of the laws of chemical~
$ prize_share          <chr> "1/1", "1/1", "1/1", "1/2", "1/2", "1/1", "1/1", "1/1", "1/1", "1/2", "1/2", "1/2", "1/2", "1/1", "1/1",~
$ laureate_id          <dbl> 160, 569, 293, 462, 463, 1, 161, 571, 294, 464, 465, 2, 3, 162, 572, 295, 466, 4, 5, 6, 163, 573, 574, 2~
$ laureate_type        <chr> "Individual", "Individual", "Individual", "Individual", "Individual", "Individual", "Individual", "Indiv~
$ full_name            <chr> "Jacobus Henricus van 't Hoff", "Sully Prudhomme", "Emil Adolf von Behring", "Jean Henry Dunant", "Frédé~
$ birth_date           <date> 1852-08-30, 1839-03-16, 1854-03-15, 1828-05-08, 1822-05-20, 1845-03-27, 1852-10-09, 1817-11-30, 1857-05~
$ birth_city           <chr> "Rotterdam", "Paris", "Hansdorf (Lawice)", "Geneva", "Paris", "Lennep (Remscheid)", "Euskirchen", "Gardi~
$ birth_country        <chr> "Netherlands", "France", "Prussia (Poland)", "Switzerland", "France", "Prussia (Germany)", "Prussia (Ger~
$ gender               <chr> "Male", "Male", "Male", "Male", "Male", "Male", "Male", "Male", "Male", "Male", "Male", "Male", "Male", ~
$ organization_name    <chr> "Berlin University", NA, "Marburg University", NA, NA, "Munich University", "Berlin University", NA, "Un~
$ organization_city    <chr> "Berlin", NA, "Marburg", NA, NA, "Munich", "Berlin", NA, "Liverpool", NA, NA, "Leiden", "Amsterdam", "St~
$ organization_country <chr> "Germany", NA, "Germany", NA, NA, "Germany", "Germany", NA, "United Kingdom", NA, NA, "Netherlands", "Ne~
$ death_date           <date> 1911-03-01, 1907-09-07, 1917-03-31, 1910-10-30, 1912-06-12, 1923-02-10, 1919-07-15, 1903-11-01, 1932-09~
$ death_city           <chr> "Berlin", "Châtenay", "Marburg", "Heiden", "Paris", "Munich", "Berlin", "Charlottenburg", "Putney Heath"~
$ death_country        <chr> "Germany", "France", "Germany", "Switzerland", "France", "Germany", "Germany", "Germany", "United Kingdo~
$ decade               <dbl> 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 19~
$ age                  <dbl> 49, 62, 47, 73, 79, 56, 50, 85, 45, 69, 59, 49, 37, 44, 71, 43, 75, 51, 44, 36, 52, 74, 72, 55, NA, 62, ~

Age Analysis

Linear fit of prize year as a function of age

ggplot(nobel_winners, aes(x = prize_year, y = age)) +
  geom_point() +
  geom_smooth(method = "lm", 
              formula = "y ~ x") + 
  theme_minimal()

Get the jist that prize recipients have been older over time at the time of receiving. Let’s take a closer look:

How has age of Nobel Prize recipients changed over time?

nobel_winners %>%
  filter(!is.na(age)) %>%
  group_by(decade) %>%
  summarize(average_age = mean(age),
            median_age = median(age)) %>%
  ggplot(aes(decade, average_age)) +
  geom_line()

Definitely a noticeable spike since the mid 1900’s.

How about over different categories?

Boxplot view of age per category

nobel_categories <- nobel_winners %>%
  mutate(category = fct_reorder(category, age, median, na.rm = TRUE)) %>%
  ggplot(aes(category, age)) +
  geom_boxplot() +
  coord_flip()

ggplotly(nobel_categories)

Get to see a couple interesting outliers here.

nobel_winners %>% 
  filter(age == 17 | age == 90) %>% 
  arrange(full_name) %>% 
  select(full_name,age,prize_year,category)

Change of age over time across categories

nobel_age <- nobel_winners %>%
  filter(!is.na(age)) %>%
  group_by(decade, category) %>%
  summarize(average_age = mean(age),
            median_age = median(age)) %>%
  ggplot(aes(decade, average_age, color = category)) +
  geom_line()
`summarise()` has grouped output by 'decade'. You can override using the `.groups` argument.
ggplotly(nobel_age)

Average age across the board has increased for the most part, especially for the “hard sciences”. Literature is the oldest, and consistently has been for a while. Peace has by far been the most volatile, notably skewed by a few data points. For the 2010’s, our data is skewed by having the 17 year old Malala Yousafzai win in 2014, in addition for data being only collected up to 2016 for this dataset.

Going back to plotting age as a function of prize_year: Adding categories with trend lines.

ggplot(data = nobel_winners, aes(x = prize_year, y = age))+
    geom_point()+
    geom_smooth()+
    facet_wrap(~ category)
`geom_smooth()` using method = 'loess' and formula 'y ~ x'

Can confirm that the sciences have taken a noticeable trend upwards, while Peace has actually had a downward trend. Economics has had little change, with Literature having a slight trend upward.

Regional Analysis

Now taking a look at distribution of birth country for Nobel Prize winners:

nobel_winners %>%
  filter(!is.na(birth_country)) %>%
  count(birth_country = fct_lump(birth_country, 25),
        sort = TRUE) %>%
  mutate(birth_country = fct_reorder(birth_country, n)) %>%
  ggplot(aes(birth_country, n)) +
  geom_col() +
  #facet_wrap(~ category) +
  coord_flip()

The United States dominates the rest of the field, having well over 3 times the number of recipients as the next highest country (U.K.)

How does birth country look across different categories?

nobel_regions <- nobel_winners %>%
  filter(!is.na(birth_country)) %>%
  count(birth_country = fct_lump(birth_country, 10),
        category,
        sort = TRUE) %>%
  mutate(birth_country = fct_reorder(birth_country, n)) %>%
  ggplot(aes(birth_country, n, fill = category)) +
  geom_col() +
  facet_wrap(~ category) +
  coord_flip()

ggplotly(nobel_regions)

United States is dominant in Chemistry, Medicine, Physics, and Economics. Literature and Peace are the most evenly divided.

How does birth country look across gender?

nobel_winners %>%
  filter(!is.na(birth_country)) %>%
  count(birth_country = fct_lump(birth_country, 10),
        gender,
        sort = TRUE) %>%
  mutate(birth_country = fct_reorder(birth_country, n)) %>%
  ggplot(aes(birth_country, n, fill = gender)) +
  geom_col() +
  facet_wrap(~ gender) +
  coord_flip()

Closer look at female distribution:

nobel_winners %>%
  filter(!is.na(birth_country)) %>%
  filter(gender == "Female") %>% 
  count(birth_country = fct_lump(birth_country, 10),
        gender,
        sort = TRUE) %>%
  mutate(birth_country = fct_reorder(birth_country, n)) %>%
  ggplot(aes(birth_country, n)) +
  geom_col() +
  facet_wrap(~ gender) +
  coord_flip()

All countries that have had multiple recipients are the United States and Europe, outside of Liberia. Can likely attribute to higher degree of independence and accessibility of education in those areas for women.

Spatial Visualization:

Load world shapefile from Natural Earth

# https://www.naturalearthdata.com/downloads/110m-cultural-vectors/
world_shapes <- read_sf("ne_110m_admin_0_countries/ne_110m_admin_0_countries.shp") 
#was having some real problems trying to path to this file when i put it in the data folder, so i cheated a bit and put it in my report folder as well

Rename nobel_winners in temp variable to join on to

nobel_winners_geo <- nobel_winners
names(nobel_winners_geo)[names(nobel_winners_geo) == 'birth_country'] <- 'GEOUNIT'

Join on country

nobel_map <- nobel_winners_geo %>%
  left_join(world_shapes, by = "GEOUNIT")

Map showing the average age of individuals in each (birth) country that a person was awarded a Nobel Prize.

# Make a map of Noble Prize winners with ggplot() + geom_sf()
ggplot() +
  geom_sf(data = nobel_map, aes(geometry = geometry, fill = age),
          color = "white", size = 0.15) +
  coord_sf(crs = "+proj=robin") +
  scale_fill_gradient2(labels = scales::comma) +
  labs(fill = NULL) +
  theme_void() +
  theme(legend.position = "bottom") +
  ggtitle("Average Age of Nobel Prize Winners For Their Respective Birth Country")

As seen above, this correlates to the number of scientists being proportionally higher in these darker regions, and the scientists are getting their rewards at an older age. That being said, the frequency of rewards in certain countries may skew their regions.

Conclusions

Nobel Prizes are predominantly won by men in the United States and Europe, who are in their late 60s. Outside research also shows that the work they won an award for was published ~25 years ago, which was approximately 20% of the way in to their career at that point. This is notably more true for the sciences, with the Peace and Literature Prizes having more variation in age and birth country.

Future possible work:

Could explore other variables such as organizations, death country, affiliation, prize split, and more. Some ideas include doing spatial visualizations with Universities, countries of death, and also doing text mining on the ‘motivation’ and ‘title’. Could also dive in to the partner data set, the nobel_winner_all_pubs, in which analysis could be done on possible variables such as papers before, total papers, position in career, first publication year among others.

LS0tDQp0aXRsZTogIkRhdGEgVmlzdWFsaXphdGlvbiAtIE1pbmktUHJvamVjdCAyIg0Kc3VidGl0bGU6ICJOb2JlbCBMYXVyZWF0ZSBXaW5uZXJzIGFuZCBQdWJsaWNhdGlvbnMiDQphdXRob3I6ICJHYWJyaWVsIE1hbnRpbmkgYGdtYW50aW5pNTAxMUBmbG9yaWRhcG9seS5lZHVgIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyBJbnRyb2R1Y3Rpb24NCg0KV2FzIGJyb3dzaW5nIHRocm91Z2ggc29tZSBvZiB0aGUgZGF0YXNldHMgdGhhdCBoYWQgYmVlbiBmZWF0dXJlZCBpbiBUaWR5VHVlc2RheSwgYW5kIHRoZSBOb2JlbCBMYXVyZWF0ZSBkYXRhIGNhdWdodCBteSBleWUuIEkgaGFkIGxpdHRsZSB0byBubyBwcmlvciBrbm93bGVkZ2Ugb24gTm9iZWwgTGF1cmVhdGUgd2lubmVyIGRhdGEsIHNvIEkgd2FzIGN1cmlvdXMgdG8gbGVhcm4gYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgbnVtYmVyIG9mIHdpbm5lcnMgYWNyb3NzIGRpZmZlcmVudCBmaWVsZHMvcmVnaW9ucy4gRnVydGhlcm1vcmUsIGl0IHNlZW1lZCBsaWtlIGEgZml0dGluZyBkYXRhIHNldCB0aGF0IHdvdWxkIGJlIGFibGUgdG8gaW5jb3Jwb3JhdGUgcmVsZXZhbnQgdmlzdWFsaXphdGlvbnMgdGhhdCB3ZXJlIGFza2VkIGZvci4gSS5lLiwgdGhlIHNwYXRpYWwgdmlzdWFsaXphdGlvbiBiZWluZyBhYmxlIHRvIGJlIHVzZWQgZm9yIHNob3dpbmcgZGlzdHJpYnV0aW9uIG9mIHdpbm5lcnMgZnJvbSBhcm91bmQgdGhlIHdvcmxkLiBGb3IgdGhlIHNjb3BlIG9mIHRoaXMgd29yaywgSSBkZWNpZGVkIHRvIGZvY3VzIG9uIHRoZSBub2JlbCB3aW5uZXJzIGRhdGEgYW5kIG5vdCB0aGUgZGF0YSB0aGF0IGluY2x1ZGVkIGFsbCBvZiB0aGUgc2VwYXJhdGUgcHVibGljYXRpb25zIGZyb20gbm9iZWwgd2lubmVycy4NCg0KIyBMaWJyYXJpZXMsIERhdGEgSW1wb3J0aW5nL1ByZXByb2Nlc3NpbmcNCg0KTG9hZCBMaWJyYXJpZXMNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpICNtb3N0bHkgZm9yIGdncGxvdA0KbGlicmFyeShsdWJyaWRhdGUpICN3b3JraW5nIHdpdGggZGF0ZXMvdGltZXMNCmxpYnJhcnkocGxvdGx5KSAjaW50ZXJhY3RpdmUgcGxvdHMNCmxpYnJhcnkoc2YpICN3b3JsZCBzaGFwZWZpbGUNCmBgYA0KDQpTZXQgdGhlbWUNCmBgYHtyfQ0KdGhlbWVfc2V0KHRoZW1lX2J3KCkpDQpgYGANCg0KUmVhZCBpbiBkYXRhLCBhZGQgY29sdW1uIHRvIHNvcnQgYnkgZGVjYWRlIGZvciBjbGVhbmVyIHBsb3RzDQpgYGB7cixtZXNzYWdlPUYsd2FybmluZz1GfQ0Kbm9iZWxfd2lubmVycyA8LSByZWFkX2NzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDE5LzIwMTktMDUtMTQvbm9iZWxfd2lubmVycy5jc3YiKSAlPiUgI3JlYWRfY3N2IGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIGhlcmUgdGhhbiByZWFkLmNzdg0KICBkaXN0aW5jdChmdWxsX25hbWUsIHByaXplX3llYXIsIGNhdGVnb3J5LCAua2VlcF9hbGwgPSBUUlVFKSAlPiUNCiAgbXV0YXRlKGRlY2FkZSA9IDEwICogKHByaXplX3llYXIgJS8lIDEwKSwNCiAgICAgICAgIGFnZSA9IHByaXplX3llYXIgLSB5ZWFyKGJpcnRoX2RhdGUpKQ0KYGBgDQoNCkdsaW1wc2UgYXQgTm9iZWwgV2lubmVycyANCmBgYHtyfQ0KZ2xpbXBzZShub2JlbF93aW5uZXJzKQ0KYGBgDQoNCg0KIyBBZ2UgQW5hbHlzaXMNCg0KTGluZWFyIGZpdCBvZiBwcml6ZSB5ZWFyIGFzIGEgZnVuY3Rpb24gb2YgYWdlDQpgYGB7cixtZXNzYWdlPUYsd2FybmluZz1GfQ0KZ2dwbG90KG5vYmVsX3dpbm5lcnMsIGFlcyh4ID0gcHJpemVfeWVhciwgeSA9IGFnZSkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgDQogICAgICAgICAgICAgIGZvcm11bGEgPSAieSB+IHgiKSArIA0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KR2V0IHRoZSBqaXN0IHRoYXQgcHJpemUgcmVjaXBpZW50cyBoYXZlIGJlZW4gb2xkZXIgb3ZlciB0aW1lIGF0IHRoZSB0aW1lIG9mIHJlY2VpdmluZy4gTGV0J3MgdGFrZSBhIGNsb3NlciBsb29rOg0KDQpIb3cgaGFzIGFnZSBvZiBOb2JlbCBQcml6ZSByZWNpcGllbnRzIGNoYW5nZWQgb3ZlciB0aW1lPw0KYGBge3IsbWVzc2FnZT1GLHdhcm5pbmc9Rn0NCm5vYmVsX3dpbm5lcnMgJT4lDQogIGZpbHRlcighaXMubmEoYWdlKSkgJT4lDQogIGdyb3VwX2J5KGRlY2FkZSkgJT4lDQogIHN1bW1hcml6ZShhdmVyYWdlX2FnZSA9IG1lYW4oYWdlKSwNCiAgICAgICAgICAgIG1lZGlhbl9hZ2UgPSBtZWRpYW4oYWdlKSkgJT4lDQogIGdncGxvdChhZXMoZGVjYWRlLCBhdmVyYWdlX2FnZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KRGVmaW5pdGVseSBhIG5vdGljZWFibGUgc3Bpa2Ugc2luY2UgdGhlIG1pZCAxOTAwJ3MuDQoNCkhvdyBhYm91dCBvdmVyIGRpZmZlcmVudCBjYXRlZ29yaWVzPw0KDQpCb3hwbG90IHZpZXcgb2YgYWdlIHBlciBjYXRlZ29yeQ0KYGBge3IsbWVzc2FnZT1GLHdhcm5pbmc9Rn0NCm5vYmVsX2NhdGVnb3JpZXMgPC0gbm9iZWxfd2lubmVycyAlPiUNCiAgbXV0YXRlKGNhdGVnb3J5ID0gZmN0X3Jlb3JkZXIoY2F0ZWdvcnksIGFnZSwgbWVkaWFuLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgZ2dwbG90KGFlcyhjYXRlZ29yeSwgYWdlKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGNvb3JkX2ZsaXAoKQ0KDQpnZ3Bsb3RseShub2JlbF9jYXRlZ29yaWVzKQ0KYGBgDQpHZXQgdG8gc2VlIGEgY291cGxlIGludGVyZXN0aW5nIG91dGxpZXJzIGhlcmUuDQpgYGB7cn0NCm5vYmVsX3dpbm5lcnMgJT4lIA0KICBmaWx0ZXIoYWdlID09IDE3IHwgYWdlID09IDkwKSAlPiUgDQogIGFycmFuZ2UoZnVsbF9uYW1lKSAlPiUgDQogIHNlbGVjdChmdWxsX25hbWUsYWdlLHByaXplX3llYXIsY2F0ZWdvcnkpDQpgYGANCg0KQ2hhbmdlIG9mIGFnZSBvdmVyIHRpbWUgYWNyb3NzIGNhdGVnb3JpZXMNCmBgYHtyLG1lc3NhZ2U9Rix3YXJuaW5nPUZ9DQpub2JlbF9hZ2UgPC0gbm9iZWxfd2lubmVycyAlPiUNCiAgZmlsdGVyKCFpcy5uYShhZ2UpKSAlPiUNCiAgZ3JvdXBfYnkoZGVjYWRlLCBjYXRlZ29yeSkgJT4lDQogIHN1bW1hcml6ZShhdmVyYWdlX2FnZSA9IG1lYW4oYWdlKSwNCiAgICAgICAgICAgIG1lZGlhbl9hZ2UgPSBtZWRpYW4oYWdlKSkgJT4lDQogIGdncGxvdChhZXMoZGVjYWRlLCBhdmVyYWdlX2FnZSwgY29sb3IgPSBjYXRlZ29yeSkpICsNCiAgZ2VvbV9saW5lKCkNCg0KZ2dwbG90bHkobm9iZWxfYWdlKQ0KYGBgDQpBdmVyYWdlIGFnZSBhY3Jvc3MgdGhlIGJvYXJkIGhhcyBpbmNyZWFzZWQgZm9yIHRoZSBtb3N0IHBhcnQsIGVzcGVjaWFsbHkgZm9yIHRoZSAiaGFyZCBzY2llbmNlcyIuIExpdGVyYXR1cmUgaXMgdGhlIG9sZGVzdCwgYW5kIGNvbnNpc3RlbnRseSBoYXMgYmVlbiBmb3IgYSB3aGlsZS4gUGVhY2UgaGFzIGJ5IGZhciBiZWVuIHRoZSBtb3N0IHZvbGF0aWxlLCBub3RhYmx5IHNrZXdlZCBieSBhIGZldyBkYXRhIHBvaW50cy4gRm9yIHRoZSAyMDEwJ3MsIG91ciBkYXRhIGlzIHNrZXdlZCBieSBoYXZpbmcgdGhlIDE3IHllYXIgb2xkIE1hbGFsYSBZb3VzYWZ6YWkgd2luIGluIDIwMTQsIGluIGFkZGl0aW9uIGZvciBkYXRhIGJlaW5nIG9ubHkgY29sbGVjdGVkIHVwIHRvIDIwMTYgZm9yIHRoaXMgZGF0YXNldC4NCg0KR29pbmcgYmFjayB0byBwbG90dGluZyBhZ2UgYXMgYSBmdW5jdGlvbiBvZiBwcml6ZV95ZWFyOiBBZGRpbmcgY2F0ZWdvcmllcyB3aXRoIHRyZW5kIGxpbmVzLg0KYGBge3IsbWVzc2FnZT1GLHdhcm5pbmc9Rn0NCmdncGxvdChkYXRhID0gbm9iZWxfd2lubmVycywgYWVzKHggPSBwcml6ZV95ZWFyLCB5ID0gYWdlKSkrDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fc21vb3RoKCkrDQogICAgZmFjZXRfd3JhcCh+IGNhdGVnb3J5KQ0KYGBgDQpDYW4gY29uZmlybSB0aGF0IHRoZSBzY2llbmNlcyBoYXZlIHRha2VuIGEgbm90aWNlYWJsZSB0cmVuZCB1cHdhcmRzLCB3aGlsZSBQZWFjZSBoYXMgYWN0dWFsbHkgaGFkIGEgZG93bndhcmQgdHJlbmQuIEVjb25vbWljcyBoYXMgaGFkIGxpdHRsZSBjaGFuZ2UsIHdpdGggTGl0ZXJhdHVyZSBoYXZpbmcgYSBzbGlnaHQgdHJlbmQgdXB3YXJkLg0KDQoNCiMgUmVnaW9uYWwgQW5hbHlzaXMNCg0KTm93IHRha2luZyBhIGxvb2sgYXQgZGlzdHJpYnV0aW9uIG9mIGJpcnRoIGNvdW50cnkgZm9yIE5vYmVsIFByaXplIHdpbm5lcnM6IA0KYGBge3J9DQpub2JlbF93aW5uZXJzICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGJpcnRoX2NvdW50cnkpKSAlPiUNCiAgY291bnQoYmlydGhfY291bnRyeSA9IGZjdF9sdW1wKGJpcnRoX2NvdW50cnksIDI1KSwNCiAgICAgICAgc29ydCA9IFRSVUUpICU+JQ0KICBtdXRhdGUoYmlydGhfY291bnRyeSA9IGZjdF9yZW9yZGVyKGJpcnRoX2NvdW50cnksIG4pKSAlPiUNCiAgZ2dwbG90KGFlcyhiaXJ0aF9jb3VudHJ5LCBuKSkgKw0KICBnZW9tX2NvbCgpICsNCiAgI2ZhY2V0X3dyYXAofiBjYXRlZ29yeSkgKw0KICBjb29yZF9mbGlwKCkNCmBgYA0KVGhlIFVuaXRlZCBTdGF0ZXMgZG9taW5hdGVzIHRoZSByZXN0IG9mIHRoZSBmaWVsZCwgaGF2aW5nIHdlbGwgb3ZlciAzIHRpbWVzIHRoZSBudW1iZXIgb2YgcmVjaXBpZW50cyBhcyB0aGUgbmV4dCBoaWdoZXN0IGNvdW50cnkgKFUuSy4pDQoNCkhvdyBkb2VzIGJpcnRoIGNvdW50cnkgbG9vayBhY3Jvc3MgZGlmZmVyZW50IGNhdGVnb3JpZXM/DQpgYGB7cn0NCm5vYmVsX3JlZ2lvbnMgPC0gbm9iZWxfd2lubmVycyAlPiUNCiAgZmlsdGVyKCFpcy5uYShiaXJ0aF9jb3VudHJ5KSkgJT4lDQogIGNvdW50KGJpcnRoX2NvdW50cnkgPSBmY3RfbHVtcChiaXJ0aF9jb3VudHJ5LCAxMCksDQogICAgICAgIGNhdGVnb3J5LA0KICAgICAgICBzb3J0ID0gVFJVRSkgJT4lDQogIG11dGF0ZShiaXJ0aF9jb3VudHJ5ID0gZmN0X3Jlb3JkZXIoYmlydGhfY291bnRyeSwgbikpICU+JQ0KICBnZ3Bsb3QoYWVzKGJpcnRoX2NvdW50cnksIG4sIGZpbGwgPSBjYXRlZ29yeSkpICsNCiAgZ2VvbV9jb2woKSArDQogIGZhY2V0X3dyYXAofiBjYXRlZ29yeSkgKw0KICBjb29yZF9mbGlwKCkNCg0KZ2dwbG90bHkobm9iZWxfcmVnaW9ucykNCmBgYA0KVW5pdGVkIFN0YXRlcyBpcyBkb21pbmFudCBpbiBDaGVtaXN0cnksIE1lZGljaW5lLCBQaHlzaWNzLCBhbmQgRWNvbm9taWNzLiBMaXRlcmF0dXJlIGFuZCBQZWFjZSBhcmUgdGhlIG1vc3QgZXZlbmx5IGRpdmlkZWQuDQoNCkhvdyBkb2VzIGJpcnRoIGNvdW50cnkgbG9vayBhY3Jvc3MgZ2VuZGVyPw0KYGBge3J9DQpub2JlbF93aW5uZXJzICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGJpcnRoX2NvdW50cnkpKSAlPiUNCiAgY291bnQoYmlydGhfY291bnRyeSA9IGZjdF9sdW1wKGJpcnRoX2NvdW50cnksIDEwKSwNCiAgICAgICAgZ2VuZGVyLA0KICAgICAgICBzb3J0ID0gVFJVRSkgJT4lDQogIG11dGF0ZShiaXJ0aF9jb3VudHJ5ID0gZmN0X3Jlb3JkZXIoYmlydGhfY291bnRyeSwgbikpICU+JQ0KICBnZ3Bsb3QoYWVzKGJpcnRoX2NvdW50cnksIG4sIGZpbGwgPSBnZW5kZXIpKSArDQogIGdlb21fY29sKCkgKw0KICBmYWNldF93cmFwKH4gZ2VuZGVyKSArDQogIGNvb3JkX2ZsaXAoKQ0KYGBgDQoNCkNsb3NlciBsb29rIGF0IGZlbWFsZSBkaXN0cmlidXRpb246DQpgYGB7cn0NCm5vYmVsX3dpbm5lcnMgJT4lDQogIGZpbHRlcighaXMubmEoYmlydGhfY291bnRyeSkpICU+JQ0KICBmaWx0ZXIoZ2VuZGVyID09ICJGZW1hbGUiKSAlPiUgDQogIGNvdW50KGJpcnRoX2NvdW50cnkgPSBmY3RfbHVtcChiaXJ0aF9jb3VudHJ5LCAxMCksDQogICAgICAgIGdlbmRlciwNCiAgICAgICAgc29ydCA9IFRSVUUpICU+JQ0KICBtdXRhdGUoYmlydGhfY291bnRyeSA9IGZjdF9yZW9yZGVyKGJpcnRoX2NvdW50cnksIG4pKSAlPiUNCiAgZ2dwbG90KGFlcyhiaXJ0aF9jb3VudHJ5LCBuKSkgKw0KICBnZW9tX2NvbCgpICsNCiAgZmFjZXRfd3JhcCh+IGdlbmRlcikgKw0KICBjb29yZF9mbGlwKCkNCmBgYA0KDQpBbGwgY291bnRyaWVzIHRoYXQgaGF2ZSBoYWQgbXVsdGlwbGUgcmVjaXBpZW50cyBhcmUgdGhlIFVuaXRlZCBTdGF0ZXMgYW5kIEV1cm9wZSwgb3V0c2lkZSBvZiBMaWJlcmlhLiBDYW4gbGlrZWx5IGF0dHJpYnV0ZSB0byBoaWdoZXIgZGVncmVlIG9mIGluZGVwZW5kZW5jZSBhbmQgYWNjZXNzaWJpbGl0eSBvZiBlZHVjYXRpb24gaW4gdGhvc2UgYXJlYXMgZm9yIHdvbWVuLg0KDQpTcGF0aWFsIFZpc3VhbGl6YXRpb246DQoNCkxvYWQgd29ybGQgc2hhcGVmaWxlIGZyb20gTmF0dXJhbCBFYXJ0aA0KYGBge3IgbG9hZC1saWJyYXJpZXMtZGF0YSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCiMgaHR0cHM6Ly93d3cubmF0dXJhbGVhcnRoZGF0YS5jb20vZG93bmxvYWRzLzExMG0tY3VsdHVyYWwtdmVjdG9ycy8NCndvcmxkX3NoYXBlcyA8LSByZWFkX3NmKCJuZV8xMTBtX2FkbWluXzBfY291bnRyaWVzL25lXzExMG1fYWRtaW5fMF9jb3VudHJpZXMuc2hwIikgDQojd2FzIGhhdmluZyBzb21lIHJlYWwgcHJvYmxlbXMgdHJ5aW5nIHRvIHBhdGggdG8gdGhpcyBmaWxlIHdoZW4gaSBwdXQgaXQgaW4gdGhlIGRhdGEgZm9sZGVyLCBzbyBpIGNoZWF0ZWQgYSBiaXQgYW5kIHB1dCBpdCBpbiBteSByZXBvcnQgZm9sZGVyIGFzIHdlbGwNCmBgYA0KDQpSZW5hbWUgbm9iZWxfd2lubmVycyBpbiB0ZW1wIHZhcmlhYmxlIHRvIGpvaW4gb24gdG8NCmBgYHtyfQ0Kbm9iZWxfd2lubmVyc19nZW8gPC0gbm9iZWxfd2lubmVycw0KbmFtZXMobm9iZWxfd2lubmVyc19nZW8pW25hbWVzKG5vYmVsX3dpbm5lcnNfZ2VvKSA9PSAnYmlydGhfY291bnRyeSddIDwtICdHRU9VTklUJw0KYGBgDQoNCkpvaW4gb24gY291bnRyeQ0KYGBge3IgY29tYmluZS1zaGFwZWZpbGUtaW50ZXJuZXQtdXNlcnN9DQpub2JlbF9tYXAgPC0gbm9iZWxfd2lubmVyc19nZW8gJT4lDQogIGxlZnRfam9pbih3b3JsZF9zaGFwZXMsIGJ5ID0gIkdFT1VOSVQiKQ0KYGBgDQoNCg0KTWFwIHNob3dpbmcgdGhlIGF2ZXJhZ2UgYWdlIG9mIGluZGl2aWR1YWxzIGluIGVhY2ggKGJpcnRoKSBjb3VudHJ5IHRoYXQgYSBwZXJzb24gd2FzIGF3YXJkZWQgYSBOb2JlbCBQcml6ZS4NCg0KYGBge3IgcGxvdC0yMDE1LWludGVybmV0LXVzZXN9DQojIE1ha2UgYSBtYXAgb2YgTm9ibGUgUHJpemUgd2lubmVycyB3aXRoIGdncGxvdCgpICsgZ2VvbV9zZigpDQpnZ3Bsb3QoKSArDQogIGdlb21fc2YoZGF0YSA9IG5vYmVsX21hcCwgYWVzKGdlb21ldHJ5ID0gZ2VvbWV0cnksIGZpbGwgPSBhZ2UpLA0KICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDAuMTUpICsNCiAgY29vcmRfc2YoY3JzID0gIitwcm9qPXJvYmluIikgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50MihsYWJlbHMgPSBzY2FsZXM6OmNvbW1hKSArDQogIGxhYnMoZmlsbCA9IE5VTEwpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgZ2d0aXRsZSgiQXZlcmFnZSBBZ2Ugb2YgTm9iZWwgUHJpemUgV2lubmVycyBGb3IgVGhlaXIgUmVzcGVjdGl2ZSBCaXJ0aCBDb3VudHJ5IikNCmBgYA0KQXMgc2VlbiBhYm92ZSwgdGhpcyBjb3JyZWxhdGVzIHRvIHRoZSBudW1iZXIgb2Ygc2NpZW50aXN0cyBiZWluZyBwcm9wb3J0aW9uYWxseSBoaWdoZXIgaW4gdGhlc2UgZGFya2VyIHJlZ2lvbnMsIGFuZCB0aGUgc2NpZW50aXN0cyBhcmUgZ2V0dGluZyB0aGVpciByZXdhcmRzIGF0IGFuIG9sZGVyIGFnZS4gVGhhdCBiZWluZyBzYWlkLCB0aGUgZnJlcXVlbmN5IG9mIHJld2FyZHMgaW4gY2VydGFpbiBjb3VudHJpZXMgbWF5IHNrZXcgdGhlaXIgcmVnaW9ucy4NCg0KDQoNCg0KIyBDb25jbHVzaW9ucw0KTm9iZWwgUHJpemVzIGFyZSBwcmVkb21pbmFudGx5IHdvbiBieSBtZW4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kIEV1cm9wZSwgd2hvIGFyZSBpbiB0aGVpciBsYXRlIDYwcy4gT3V0c2lkZSByZXNlYXJjaCBhbHNvIHNob3dzIHRoYXQgIHRoZSB3b3JrIHRoZXkgd29uIGFuIGF3YXJkIGZvciB3YXMgcHVibGlzaGVkIH4yNSB5ZWFycyBhZ28sIHdoaWNoIHdhcyBhcHByb3hpbWF0ZWx5IDIwJSBvZiB0aGUgd2F5IGluIHRvIHRoZWlyIGNhcmVlciBhdCB0aGF0IHBvaW50LiBUaGlzIGlzIG5vdGFibHkgbW9yZSB0cnVlIGZvciB0aGUgc2NpZW5jZXMsIHdpdGggdGhlIFBlYWNlIGFuZCBMaXRlcmF0dXJlIFByaXplcyBoYXZpbmcgbW9yZSB2YXJpYXRpb24gaW4gYWdlIGFuZCBiaXJ0aCBjb3VudHJ5Lg0KDQoNCkZ1dHVyZSBwb3NzaWJsZSB3b3JrOg0KDQpDb3VsZCBleHBsb3JlIG90aGVyIHZhcmlhYmxlcyBzdWNoIGFzIG9yZ2FuaXphdGlvbnMsIGRlYXRoIGNvdW50cnksIGFmZmlsaWF0aW9uLCBwcml6ZSBzcGxpdCwgYW5kIG1vcmUuIFNvbWUgaWRlYXMgaW5jbHVkZSBkb2luZyBzcGF0aWFsIHZpc3VhbGl6YXRpb25zIHdpdGggVW5pdmVyc2l0aWVzLCBjb3VudHJpZXMgb2YgZGVhdGgsIGFuZCBhbHNvIGRvaW5nIHRleHQgbWluaW5nIG9uIHRoZSAnbW90aXZhdGlvbicgYW5kICd0aXRsZScuIENvdWxkIGFsc28gZGl2ZSBpbiB0byB0aGUgcGFydG5lciBkYXRhIHNldCwgdGhlIG5vYmVsX3dpbm5lcl9hbGxfcHVicywgaW4gd2hpY2ggYW5hbHlzaXMgY291bGQgYmUgZG9uZSBvbiBwb3NzaWJsZSB2YXJpYWJsZXMgc3VjaCBhcyBwYXBlcnMgYmVmb3JlLCB0b3RhbCBwYXBlcnMsIHBvc2l0aW9uIGluIGNhcmVlciwgZmlyc3QgcHVibGljYXRpb24geWVhciBhbW9uZyBvdGhlcnMuDQoNCg==